trigger_key_event(KEY_FUEL_SELECTOR_ALL,0);
lookup_var(&fuelflow1);
lookup_var(&fuelflow2);
lookup_var(&fuelflow3);
lookup_var(&fuelflow4);
lookup_var(&totalfuel);
lookup_var(&tank0);
lookup_var(&tank1);
lookup_var(&tank2);
lookup_var(&tank3);
lookup_var(&tank4);
lookup_var(&tankcapacity0);
lookup_var(&tankcapacity1);
lookup_var(&tankcapacity2);
lookup_var(&tankcapacity3);
lookup_var(&tankcapacity4);
lookup_var(&fueldensity);
oldtank[1]=newtank[1];
oldtank[2]=newtank[2];
oldtank[0]=newtank[0];
oldtank[3]=newtank[3];
oldtank[4]=newtank[4];
// ------------------------- which tanks are available? ---------------------
if (( tank0.var_value.n != 0) && ((altitude.var_value.n < 6096) || (boostpumps%1024 > 255))) tankavail[0]=1; else tankavail[0]=0;
if (( tank1.var_value.n != 0) && ((altitude.var_value.n < 6096) || (boostpumps%256 > 63))) tankavail[1]=1; else tankavail[1]=0;
if (( tank2.var_value.n != 0) && ((altitude.var_value.n < 6096) || (boostpumps%64 > 15))) tankavail[2]=1; else tankavail[2]=0;
if (( tank3.var_value.n != 0) && ((altitude.var_value.n < 6096) || (boostpumps%16 > 3))) tankavail[3]=1; else tankavail[3]=0;
if (( tank4.var_value.n != 0) && ((altitude.var_value.n < 6096) || (boostpumps%4 != 0))) tankavail[4]=1; else tankavail[4]=0;
// ------------------------- how are engines connected to tanks?--------------------------------------
if (boostpumps & 1024) matrix[1][0] = tankavail[0]; else matrix[1][0] = 0; // engine 1 connected to centre tank
if (boostpumps & 2048) matrix[2][0] = tankavail[0]; else matrix[2][0] = 0; // engine 2 connected to centre tank
if (boostpumps & 4096) matrix[3][0] = tankavail[0]; else matrix[3][0] = 0; // engine 3 connected to centre tank
if (boostpumps & 8192) matrix[4][0] = tankavail[0]; else matrix[4][0] = 0; // engine 4 connected to centre tank
for(j = 1; j<5; j++) {
for(i = 1 ; i<5 ; i++) {
if (i == j) matrix[i][j] = tankavail[j]; else matrix[i][j] = matrix[i][0]*matrix[j][0]*tankavail[j]; // cross-tank connections
}
}
// ------------------------- how many tanks per engine? --------------------------------------
// fuelavail[i] = number of tanks which can feed engine i
for (i=1;i<5;i++) {
fuelavail[i] = 0;
for (j=0;j<5;j++) {
if (matrix[i][j] != 0) fuelavail[i]++;
}
}
// ------------------------- fuel flow per tank --------------------------------------
// tankflow[j] = flow in pounds per hour from tank j
// totaltankflow2 = actual fuel flow in pounds per hour
for (j=0;j<5;j++) {
tankflow[j] = 0;
if (fuelavail[1] != 0) tankflow[j]+=fuelflow1.var_value.n*(FLOAT64)matrix[1][j]/(FLOAT64)fuelavail[1]; // contribution to tank j consumption from engine 1
if (fuelavail[2] != 0) tankflow[j]+=fuelflow2.var_value.n*(FLOAT64)matrix[2][j]/(FLOAT64)fuelavail[2]; // contribution to tank j consumption from engine 2
if (fuelavail[3] != 0) tankflow[j]+=fuelflow3.var_value.n*(FLOAT64)matrix[3][j]/(FLOAT64)fuelavail[3]; // contribution to tank j consumption from engine 3
if (fuelavail[4] != 0) tankflow[j]+=fuelflow4.var_value.n*(FLOAT64)matrix[4][j]/(FLOAT64)fuelavail[4]; // contribution to tank j consumption from engine 4
}
// convert tank flow PPH to actual fuel burn in pounds
lookup_var(&simrate);
totalburn = 0;
for (j=0;j<5;j++) {
if (tankavail[j] != 0) {
burn[j] = tankflow[j]/3600.0;
totalburn+=burn[j];
burn[j]=burn[j]+jettisonm[j];
} else burn[j]=jettisonm[j];
}
// -------------------- loop back if tank would be emptied by burn ------------------
// ----------- (empty relevant tank, distribute main burn among remaining tanks -----
if (burn[0] > oldtank[0]) { // centre tank
burn[0] = oldtank[0];
}
if (burn[1] > oldtank[1]) { // left aux
burn[1] = oldtank[1];
}
if (burn[2] > oldtank[2]) { // left main
burn[2] = oldtank[2];
}
if (burn[3] > oldtank[3]) { // right main
burn[3] = oldtank[3];
}
if (burn[4] > oldtank[4]) { // right aux
burn[4] = oldtank[4];
}
// ====================== reset fuel quantities ============================================
lookup_var(&gmthr);
lookup_var(&gmtmin);
lookup_var(&gmtsec);
if (timechecksum != gmthr.var_value.n*3600+gmtmin.var_value.n*60+gmtsec.var_value.n) {
timeinterval = gmthr.var_value.n*3600+gmtmin.var_value.n*60+gmtsec.var_value.n-timechecksum;
if (timechecksum > 500000) timeinterval = 0;
if (timeinterval < 0) timeinterval += 86400;
for(j=0;j<5;j++) newtank[j]=oldtank[j]-timeinterval*burn[j];
timechecksum = gmthr.var_value.n*3600+gmtmin.var_value.n*60+gmtsec.var_value.n;
lookup_var(&tank0);
lookup_var(&tank1);
lookup_var(&tank2);
lookup_var(&tank3);
lookup_var(&tank4);
lookup_var(&tankcapacity0);
lookup_var(&tankcapacity1);
lookup_var(&tankcapacity2);
lookup_var(&tankcapacity3);
lookup_var(&tankcapacity4);
lookup_var(&fueldensity);
fueltest1=(int)(newtank[1]*8988608.0/((FLOAT64)tankcapacity1.var_value.n*(FLOAT64)fueldensity.var_value.n));
fueltest2=(int)(newtank[2]*8988608.0/((FLOAT64)tankcapacity2.var_value.n*(FLOAT64)fueldensity.var_value.n));
fueltest0=(int)(newtank[0]*8988608.0/((FLOAT64)tankcapacity0.var_value.n*(FLOAT64)fueldensity.var_value.n));
fueltest3=(int)(newtank[3]*8988608.0/((FLOAT64)tankcapacity3.var_value.n*(FLOAT64)fueldensity.var_value.n));
fueltest4=(int)(newtank[4]*8988608.0/((FLOAT64)tankcapacity4.var_value.n*(FLOAT64)fueldensity.var_value.n));
// if rapid change in fuel quantities, skip routine as menu option used to change fuel contents
if ((fabs(tank0.var_value.n - fueltest0) < 200000) &&
(fabs(tank1.var_value.n - fueltest1) < 200000) &&
(fabs(tank2.var_value.n - fueltest2) < 200000) &&
(fabs(tank3.var_value.n - fueltest3) < 200000) &&
(fabs(tank4.var_value.n - fueltest4) < 200000)) {
// calculate new tank quantities in pounds
// fsuipc=FSUIPC_Write(0x0B84, 4, &fueltest1, &fsutest); // left aux
// fsuipc=FSUIPC_Write(0x0B7C, 4, &fueltest2, &fsutest); // left main
// fsuipc=FSUIPC_Write(0x0B74, 4, &fueltest0, &fsutest); // centre
// fsuipc=FSUIPC_Write(0x0B94, 4, &fueltest3, &fsutest); // right main
// fsuipc=FSUIPC_Write(0x0B9C, 4, &fueltest4, &fsutest); // right aux
// fsuipc=FSUIPC_Process(&fsutest);
}
} else {
newtank[1]=tank1.var_value.n*tankcapacity1.var_value.n*fueldensity.var_value.n/8988608.0;
newtank[2]=tank2.var_value.n*tankcapacity2.var_value.n*fueldensity.var_value.n/8988608.0;
newtank[0]=tank0.var_value.n*tankcapacity0.var_value.n*fueldensity.var_value.n/8988608.0;
newtank[3]=tank3.var_value.n*tankcapacity3.var_value.n*fueldensity.var_value.n/8988608.0;
newtank[4]=tank4.var_value.n*tankcapacity4.var_value.n*fueldensity.var_value.n/8988608.0;
}